package reflect;

import bean.Student;

import java.lang.reflect.Field;

/**
 * 必须掌握:
 * 怎么通过反射机制访问一个Java对象的属性？
 * 给属性赋值set
 * 获取属性的值get
 */
public class ReflectTest07 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
        // 不使用反射机制，怎么去访问一个对象的属性呢？
        Student student = new Student();
        // 给属性赋值
        student.no = 111;
        // 读属性
        System.out.println(student.no);


        // 使用反射机制，怎么去访问一个对象的属性(set get)
        Class<?> aClass = Class.forName("bean.Student");
        // o就是student对象(底层调用无参数构造方法)
        Object o = aClass.newInstance();
        // 获取no属性(根据属性的名称来获取Field)
        Field no = aClass.getDeclaredField("no");

        // 给o对象(student对象)的no属性赋值
        no.set(o, 22222);
        // 反射机制让代码复杂了，但是更加灵活。

        // 读取属性的值
        System.out.println(no.get(o));

        // 可以访问私有属性吗？
        Field name = aClass.getDeclaredField("name");
        // 不行的。但是可以打破封装(反射机制的缺点: 打破封装，可能会给不法分子留下机会)
        // 这样设置之后，在外部也是可以访问private的
        name.setAccessible(true);
        name.set(o, "Java");
        System.out.println(name.get(o));

    }
}
